package database

import (
	"database/sql"
	"fmt"
	"log"
	"time"
	"think/config"

	_ "github.com/go-sql-driver/mysql"
)

// DB 全局数据库连接池
var DB *sql.DB

// InitDB 初始化数据库连接
func InitDB() error {
	// 构建DSN
	connStr := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=true&loc=Local",
		config.DBConfig.Username,
		config.DBConfig.Password,
		config.DBConfig.Host,
		config.DBConfig.Port,
		config.DBConfig.Database,
		config.DBConfig.Charset,
	)

	// 打开数据库连接
	db, err := sql.Open(config.DBConfig.Driver, connStr)
	if err != nil {
		return fmt.Errorf("数据库连接失败: %v", err)
	}

	// 设置连接池参数
	db.SetMaxOpenConns(config.DBConfig.MaxOpenConns)
	db.SetMaxIdleConns(config.DBConfig.MaxIdleConns)
	db.SetConnMaxLifetime(time.Hour)

	// 验证连接
	if err := db.Ping(); err != nil {
		return fmt.Errorf("数据库连接验证失败: %v", err)
	}

	DB = db
	log.Println("数据库连接成功")
	return nil
}

// CloseDB 关闭数据库连接
func CloseDB() error {
	if DB != nil {
		return DB.Close()
	}
	return nil
}

// Query 执行查询并返回结果
func Query(query string, args ...interface{}) (*sql.Rows, error) {
	return DB.Query(query, args...)
}

// Exec 执行非查询SQL语句
func Exec(query string, args ...interface{}) (sql.Result, error) {
	return DB.Exec(query, args...)
}